      !> @brief subrotina para a escolha automática do número de classes para a clusterização.
      !> A escolha é baseada no menor valor da função objetivo. 
      subroutine numclassesF(Nclasses,X)

      use globais
      implicit none



!       integer :: nx0,nz0
      double precision :: X(nx0*nz0)
!       double precision :: c0(nx0,nz0)
      integer :: Nclasses !< Número de classes para a clusterização


      integer :: i,j
      integer :: ierr !< Indica se houve erro na alocação de memória


      integer :: kncl !< Contador do número de classes.
      double precision :: valuebest !< Melhor valor da função objetivo entre os números de classe testados
      double precision :: valuekncl !< Valor da função objetivo referente a kncl classes

      double precision, dimension(:), allocatable :: Xaux !< variaveis de otimizacao/parametros da inversao auxiliar.

      double precision :: value

      double precision :: mapCemX
!       double precision :: cmin
!       double precision :: cmax


      double precision :: lamdanaux

      write(*,*)'alocando Xaux...'
      allocate(xaux(nx0*nz0))

      lambdanaux = lambdan
      lambdan = 0.0d0

!       Nclasses = 0
!       valuebest = VALUE(X)
!       valuebest = 100000000.d0
! 	  write(4,*)Nclasses,valuebest

      do kncl = 2,int(nz0/3) !< busca o melhor numero de classes para a clusterização.
	  call modelo2d(X) ! do X original, crio a matriz c0
	  call clusteriza(c0,nx0,nz0,kncl) ! clusterizo a matriz c0

	  if(suav.eq.1)then
	      call suaviza(c0,nx0,nz0) ! suavizo a matriz c0
	  endif

	  do j=1,nz0
	      do i=1,nx0
		  Xaux((j-1)*nx0+i) = mapCemX(c0(i,j),cmin,cmax) ! de c0 encontro X correspondente
	      enddo
	  enddo

	  valuekncl = VALUE(Xaux)
! 	      write(4,*)'****************************',kncl,VALUE(Xaux)
	  if(kncl.eq.2)then
	      Nclasses = kncl
	      valuebest = valuekncl
	  elseif(valuekncl.lt.valuebest)then ! avalio o novo modelo
	      Nclasses = kncl
	      valuebest = valuekncl
	  endif
	  if(kncl.ge.(Nclasses+3))exit
      enddo

      !< retorno apenas Nclasses, c0 deve ser recalculado


      deallocate(Xaux)

      lambdan = lambdanaux
      return
      end subroutine numclassesF 
